/**
 * @file snakecreateroomdialog.h
 * @brief Snake游戏创建房间对话框类头文件
 *
 * SnakeCreateRoomDialog是Snake游戏的房间创建对话框，提供：
 * - 房间名称设置
 * - 游戏参数配置
 * - 房间设置选项
 * - 用户友好的界面
 * - 参数验证和错误提示
 */

#ifndef SNAKECREATEROOMDIALOG_H
#define SNAKECREATEROOMDIALOG_H

#include <QDialog>              // Qt对话框基类
#include <QVBoxLayout>          // 垂直布局
#include <QHBoxLayout>          // 水平布局
#include <QFormLayout>          // 表单布局
#include <QLineEdit>            // 单行编辑框
#include <QSpinBox>             // 数字选择框
#include <QComboBox>            // 组合框
#include <QCheckBox>            // 复选框
#include <QPushButton>          // 按钮
#include <QLabel>               // 标签
#include <QGroupBox>            // 分组框
#include <QDialogButtonBox>     // 对话框按钮框
#include "snakegamemanager.h"

/**
 * @class SnakeCreateRoomDialog
 * @brief Snake游戏创建房间对话框类
 *
 * 提供用户友好的房间创建界面，允许用户自定义房间设置。
 * 包含参数验证、默认值设置、帮助提示等功能。
 */
class SnakeCreateRoomDialog : public QDialog
{
    Q_OBJECT  // 启用Qt元对象系统

public:
    explicit SnakeCreateRoomDialog(QWidget *parent = nullptr);
    ~SnakeCreateRoomDialog();

    /**
     * @brief 获取房间配置
     * @return 房间配置结构
     */
    SnakeGameManager::GameConfig getRoomConfig() const;

    /**
     * @brief 设置默认房间配置
     * @param config 默认配置
     */
    void setDefaultConfig(const SnakeGameManager::GameConfig &config);

    /**
     * @brief 重置为默认值
     */
    void resetToDefaults();

private slots:
    /**
     * @brief 接受按钮点击处理
     */
    void onAcceptClicked();

    /**
     * @brief 重置按钮点击处理
     */
    void onResetClicked();

    /**
     * @brief 游戏模式改变处理
     * @param index 模式索引
     */
    void onGameModeChanged(int index);

    /**
     * @brief 地图大小改变处理
     */
    void onMapSizeChanged();

    /**
     * @brief 游戏速度改变处理
     * @param value 速度值
     */
    void onGameSpeedChanged(int value);

private:
    // === UI组件 ===
    QVBoxLayout *m_mainLayout;          ///< 主布局
    
    // === 基本设置组 ===
    QGroupBox *m_basicGroupBox;         ///< 基本设置分组框
    QFormLayout *m_basicFormLayout;     ///< 基本设置表单布局
    QLineEdit *m_roomNameEdit;          ///< 房间名称编辑框
    QSpinBox *m_maxPlayersSpinBox;      ///< 最大玩家数选择框
    QComboBox *m_gameModeComboBox;      ///< 游戏模式组合框
    
    // === 地图设置组 ===
    QGroupBox *m_mapGroupBox;           ///< 地图设置分组框
    QFormLayout *m_mapFormLayout;       ///< 地图设置表单布局
    QSpinBox *m_mapWidthSpinBox;        ///< 地图宽度选择框
    QSpinBox *m_mapHeightSpinBox;       ///< 地图高度选择框
    QComboBox *m_mapSizePresetComboBox; ///< 地图大小预设组合框
    
    // === 游戏设置组 ===
    QGroupBox *m_gameGroupBox;          ///< 游戏设置分组框
    QFormLayout *m_gameFormLayout;      ///< 游戏设置表单布局
    QSpinBox *m_gameSpeedSpinBox;       ///< 游戏速度选择框
    QLabel *m_gameSpeedLabel;           ///< 游戏速度标签
    QSpinBox *m_maxFoodSpinBox;         ///< 最大食物数选择框
    
    // === 高级设置组 ===
    QGroupBox *m_advancedGroupBox;      ///< 高级设置分组框
    QVBoxLayout *m_advancedLayout;      ///< 高级设置布局
    QCheckBox *m_enableWallsCheckBox;   ///< 启用墙壁复选框
    QCheckBox *m_enableSpecialFoodsCheckBox; ///< 启用特殊食物复选框
    
    // === 按钮 ===
    QDialogButtonBox *m_buttonBox;      ///< 对话框按钮框
    QPushButton *m_resetButton;         ///< 重置按钮
    
    // === 默认配置 ===
    SnakeGameManager::GameConfig m_defaultConfig; ///< 默认配置
    
    // === 私有方法 ===
    void setupUI();
    void setupBasicSettings();
    void setupMapSettings();
    void setupGameSettings();
    void setupAdvancedSettings();
    void setupButtons();
    void setupConnections();
    void updateGameSpeedLabel();
    void updateMapSizeFromPreset();
    bool validateInput();
    void showValidationError(const QString &message);
};

#endif // SNAKECREATEROOMDIALOG_H
